/**
 * @(#)BasicGripperUI.java Copyright 2002 - 2004 JIDE Software. All rights reserved.
 */
package com.element.plaf.basic;

import com.element.plaf.GripperUI;
import com.element.plaf.UIDefaultsLookup;
import com.element.swing.Gripper;
import com.element.util.UIUtil;

import javax.swing.*;
import javax.swing.plaf.ComponentUI;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

/**
 * A Basic L&F implementation of GripperUI.
 */
public class BasicGripperUI extends GripperUI {
	private int _size;

	protected ThemePainter _painter;

	protected com.element.plaf.basic.Painter _gripperPainter;

	public static ComponentUI createUI(JComponent c) {
		return new BasicGripperUI();
	}

	@Override
	public void installUI(JComponent c) {
		_painter = (ThemePainter) UIDefaultsLookup.get("Theme.painter");
		_gripperPainter = (Painter) UIDefaultsLookup.get("Gripper.painter");
		installDefaults((Gripper) c);
		installListeners((Gripper) c);
	}

	@Override
	public void uninstallUI(JComponent c) {
		_painter = null;
		_gripperPainter = null;
		uninstallDefaults((Gripper) c);
		uninstallListeners((Gripper) c);
	}

	protected void installDefaults(Gripper s) {
		_size = UIDefaultsLookup.getInt("Gripper.size");
	}

	protected void uninstallDefaults(Gripper s) {
	}

	protected MouseListener createMouseListener() {
		return new GripperMouseListener();
	}

	protected void installListeners(Gripper g) {
		MouseListener listener = createMouseListener();
		if (listener != null) {
			// put the listener in the gripper's client properties so that
			// we can get at it later
			g.putClientProperty(this, listener);
			g.addMouseListener(listener);
		}
	}

	protected void uninstallListeners(Gripper g) {
		MouseListener listener = (MouseListener) g.getClientProperty(this);
		g.putClientProperty(this, null);
		if (listener != null) {
			g.removeMouseListener(listener);
		}
	}

	protected void paintBackground(Graphics g, Gripper b) {
		Rectangle rect = new Rectangle(0, 0, b.getWidth(), b.getHeight());
		if (b.isRollover()) {
			getPainter().paintButtonBackground(b, g, rect, 0, ThemePainter.STATE_ROLLOVER);
		} else {
			if (b.isOpaque()) {
				getPainter().paintButtonBackground(b, g, rect, 0, b.isSelected() ? ThemePainter.STATE_SELECTED : ThemePainter.STATE_DEFAULT, false);
				if ("true".equals(System.getProperty("shadingtheme", "false"))) {
					UIUtil.fillGradient(g, rect, SwingConstants.HORIZONTAL);
				}
			}
		}
	}

	@Override
	public void paint(Graphics g, JComponent c) {
		Gripper gripper = (Gripper) c;
		paintBackground(g, gripper);
		int state = gripper.isSelected() ? ThemePainter.STATE_SELECTED : ThemePainter.STATE_DEFAULT;
		if (_gripperPainter == null) {
			getPainter().paintGripper(c, g, new Rectangle(0, 0, c.getWidth(), c.getHeight()), gripper.getOrientation(), state);
		} else {
			_gripperPainter.paint(c, g, new Rectangle(0, 0, c.getWidth(), c.getHeight()), gripper.getOrientation(), state);
		}
	}

	@Override
	public Dimension getPreferredSize(JComponent c) {
		return new Dimension(_size, _size);
	}

	@Override
	public Dimension getMinimumSize(JComponent c) {
		return getPreferredSize(c);
	}

	@Override
	public Dimension getMaximumSize(JComponent c) {
		Gripper gripper = (Gripper) c;
		if (gripper.getOrientation() == SwingConstants.HORIZONTAL)
			return new Dimension(_size, c.getParent().getHeight());
		else
			return new Dimension(c.getParent().getWidth(), _size);
	}

	public ThemePainter getPainter() {
		return _painter;
	}

	static class GripperMouseListener extends MouseAdapter {
		@Override
		public void mouseEntered(MouseEvent e) {
			super.mouseEntered(e);
			if (e.getSource() instanceof Gripper) {
				if (((Gripper) e.getSource()).isRolloverEnabled()) {
					((Gripper) e.getSource()).setRollover(true);
				}
			}
		}

		@Override
		public void mouseExited(MouseEvent e) {
			super.mouseExited(e);
			if (e.getSource() instanceof Gripper) {
				if (((Gripper) e.getSource()).isRolloverEnabled()) {
					((Gripper) e.getSource()).setRollover(false);
				}
			}
		}
	}
}




